www.gusucode.com > 一个ajax功能的JS xml读取封装类代码源码程序 > 一个ajax功能的JS xml读取封装类代码/xml/xml/readXML.js
var xmlFile="menuConfig.xml"; //新建XML文档对象 function createXMLDom(){ if (window.ActiveXObject){ //在IE下使用ActiveX来创建 var xmldoc=new ActiveXObject("Microsoft.XMLDOM"); }else{ //在其他浏览器上,例如Firefox,使用document.implementation.createDocument来创建 if (document.implementation&&document.implementation.createDocument) var xmldoc=document.implementation.createDocument("","doc",null); } //异步读取XML文件 xmldoc.async = false; //为了兼容FireFox等浏览器,preserveWhiteSpace设置为true,不过我们会在后面的程序中进行处理; xmldoc.preserveWhiteSpace=true; //返回xml文档对象 return xmldoc; } //创建XMLHttp对象,这是以备XML文档对象无法创建时用来读取XML对象的 function createXMLHttp(){ var xmlHttp; if (window.ActiveXObject){ //IE下用Activex来创建 xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); }else{ //Firefox已经内置对xmlhttp的支持 xmlHttp=new XMLHttpRequest(); } //返回xmlhttp对象 return xmlHttp; } //加载XML文件。 var xmlDom=createXMLDom(); try{ //直接装载XML文件 xmlDom.load(xmlFile); }catch(e){ //如果失败就使用xmlhttp方式返回responseXML方式来装载 var xmlHttp=createXMLHttp(); xmlHttp.onreadystatechange = function(){ if(xmlHttp.readyState == 4){ xmlDom=xmlHttp.responseXML; } } //使用同步的Get方式获取xml文件 xmlHttp.open("GET",xmlFile,false); xmlHttp.send(null); } var DOMRoot=xmlDom.documentElement; //为根节点增加一个Menu_ID属性,并赋值为Menu newAttribute(DOMRoot,"Menu_ID","Menu"); //从根节点开始遍历整个XML switchTree(DOMRoot,0) //取得一级菜单的数目 NoOffFirstLineMenus=getChildCount(DOMRoot); //遍历XML中的所有节点 function switchTree(pNode,pLevel){ var tNode,i,x; x=1; for(i=0;tNode=pNode.childNodes[i];i++){ if(tNode.nodeType==3) continue;//因为preserveWhiteSpace等于true,所以要把空行的childNode过滤掉 var c=getChildCount(tNode); if (pLevel==0) {//一级菜单的定义为Menu1,Menu2,没有下划线 newAttribute(tNode,"Menu_ID",getDOMAtt(pNode,"Menu_ID")+x); }else{//二级以上菜单定义为Menu1_x,每级间用下划线分隔 newAttribute(tNode,"Menu_ID",getDOMAtt(pNode,"Menu_ID")+"_"+x); } //document.write(nbsp(pLevel),"("+c+")",getNodeName(tNode),attList(tNode),getNodeValue(tNode),"<br />"); //alert(getDOMAtt(tNode,"Menu_ID")+'=new Array("'+getDOMAtt(tNode,"name")+'","'+getDOMAtt(tNode,"link")+'","'+getDOMAtt(tNode,"background")+'",'+c+','+getDOMAtt(tNode,"height")+','+getDOMAtt(tNode,"width")+');'); eval(getDOMAtt(tNode,"Menu_ID")+'=new Array("'+getDOMAtt(tNode,"name")+'","'+getDOMAtt(tNode,"link")+'","'+getDOMAtt(tNode,"background")+'",'+c+','+getDOMAtt(tNode,"height")+','+getDOMAtt(tNode,"width")+');'); x++; switchTree(tNode,pLevel+1); } } //取出指定节点的属性。 function getDOMAtt(pNode,pAttribute){ try{ return pNode.attributes.getNamedItem(pAttribute).nodeValue; }catch(e){ //alert("指定节点不存在,或指定属性:"+pAttribute+" 不存在!") return ""; } } //取得节点的名称tagName function getNodeName(pNode){ if(pNode.nodeType == 4) return ''; return pNode.nodeName; } //取得指定节点的所有属性名称和值 function attList(pNode){ if(pNode.nodeType == 4) return ''; var oAtt,tmpString="[ "; try{ for(var i=0;oAtt=pNode.attributes[i];i++){ tmpString+=oAtt.nodeName+" = '" + oAtt.nodeValue+"' "; } tmpString+=" ]" return tmpString; }catch(e){ return ""; } } //取得节点的值 function getNodeValue(pNode){ try{ return " : " + pNode.firstChild.nodeValue; }catch(e){ return ''; } } //产生指定数量的空格,用于缩进来表示层级关系 function nbsp(pNum){ var tmpString=""; for(var i=0;i<pNum;i++){ tmpString+=" "//这里是html的空格 } return tmpString; } //为指定的节点添加一个属性,并赋值 function newAttribute(tNode,attName,attValue){ var r1 = xmlDom.createAttribute(attName); r1.value=attValue; //添加属性 tNode.setAttributeNode(r1); } //计算此节点下的子节点数目,其中过滤掉换行等空白节点 function getChildCount(tNode){ var c=0; for (var i=0;i<tNode.childNodes.length ;i++ ) { if(tNode.childNodes[i].nodeType!=3) { c++; } } return c; }